package com.xxin.core.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.mybatisflex.core.service.IService;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.xxin.module.pojo.BaseEntity;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author lvjx
 */

public class CodegenMybatisFlexCodegen {
    public static void main(String[] args) {
        //配置数据源
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/pet_db?characterEncoding=utf-8");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        
        //创建配置内容，两种风格都可以。
        // 默认配置
        GlobalConfig globalConfig = createGlobalConfigUseStyle1();
        // 指定配置
//        GlobalConfig globalConfig = createGlobalConfigUseStyle2();
        
        //通过 datasource 和 globalConfig 创建代码生成器
        Generator generator = new Generator(dataSource, globalConfig);
        
        //生成代码
        generator.generate();
    }
    
    /**
     * 生成原则1
     * 直接生成
     *
     * @return
     */
    public static GlobalConfig createGlobalConfigUseStyle1() {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();
        
        //设置根包
        globalConfig.setBasePackage("com.xxin.module");
        
        //设置表前缀和只生成哪些表
        // 前缀，没有不加
//        globalConfig.setTablePrefix("tb_");
        // 填写需要生成的表
//        globalConfig.getStrategyConfig()
//                // 生成所有表
//                .setGenerateSchema("demo");
//        globalConfig.setGenerateTable("es_goods", "es_product", "es_product_store", "goods", "norms_value", "product", "store", "test_table", "wechat_user");
        
        //设置生成 entity
        globalConfig.setEntityPackage("com.xxin.core.pojo.entity");
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntitySuperClass(BaseEntity.class);
        // 启用 Lombok
        globalConfig.setEntityWithLombok(true);
        //设置生成 mapper
        globalConfig.setMapperGenerateEnable(true);
        // 控制类
//        globalConfig.setControllerGenerateEnable(true);
        // 服务类
        globalConfig.setServiceGenerateEnable(true);
//        // 服务实现类
//        globalConfig.setServiceImplGenerateEnable(true);
//        globalConfig.setServiceImplSuperClass(ServiceImpl.class);
        // 文件
////        globalConfig.setMapperXmlGenerateEnable(true);
//        globalConfig.getServiceImplConfig()
//                .setSuperClass(ServiceImpl.class);
        // 表定义辅助类
//        globalConfig.setTableDefGenerateEnable(true);
        
        // 注释配置
//        Date date = new Date();
//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//        String format = dateFormat.format(date);
//        globalConfig.getJavadocConfig()
//                .setAuthor("你的鼎鼎大名")
//                .setSince(format);
        return globalConfig;
    }
    
    /**
     * 生成原则2
     * 自定义生成
     *
     * @return
     */
    public static GlobalConfig createGlobalConfigUseStyle2() {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();
        
        //设置根包
        globalConfig.getPackageConfig()
                .setBasePackage("com.example.mybatisflax");
        
        //设置表前缀和只生成哪些表，setGenerateTable 未配置时，生成所有表
        globalConfig.getStrategyConfig()
                // 生成所有表
                .setGenerateSchema("demo");
        // 制定表生成
        //可以单独配置某个表
//                .setGenerateTable("es_goods");
//                .setGenerateTable("es_goods", "es_product", "es_product_store", "goods", "norms_value", "product", "store", "test_table", "wechat_user");
        
        //设置生成 entity 并启用 Lombok
        globalConfig.enableEntity().setWithLombok(true);
        globalConfig.getMapperConfig()
                .setClassPrefix("My")
                .setClassSuffix("Entity");
        
        
        //设置生成 mapper
        globalConfig.enableMapper();
        globalConfig.getMapperConfig()
                .setClassPrefix("My")
                .setClassSuffix("mapper");
        
        
        // 设置生成Controller
        globalConfig.enableController();
        globalConfig.getControllerConfig()
                .setClassPrefix("My")
                .setClassSuffix("Controller")
                .setRestStyle(true);
        
        
        // 设置生成Service
        globalConfig.enableService();
        globalConfig.getServiceConfig()
                .setClassPrefix("My")
                .setClassSuffix("Service")
                .setSuperClass(IService.class);
        
        // 设置serviceImpl
        globalConfig.enableServiceImpl();
        globalConfig.getServiceImplConfig()
                .setClassPrefix("My")
                .setClassSuffix("ServiceImpl")
                .setSuperClass(ServiceImpl.class);
        
        
        // 生成MapperXml
        globalConfig.enableMapperXml();
        globalConfig.getMapperXmlConfig()
                .setFilePrefix("My")
                .setFileSuffix("Mapper");
        
        
        // 生成配置 TableDefConfig
//        globalConfig.enableTableDef();
//        globalConfig.getTableDefConfig()
//                .setClassPrefix("My")
//                .setClassSuffix("Def");
        
        // 注释配置
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String format = dateFormat.format(date);
        globalConfig.getJavadocConfig()
                .setAuthor("你的鼎鼎大名")
                .setSince(format);
        
        return globalConfig;
    }
}
